#include<iostream>
#include<jsoncpp/json/json.h> 
#include<sstream> 
#include<string>

std::string serialize()
{
  //1.把要序列化的字段加到Json::Value中  
  Json::Value root ; 
  root["姓名"]  = "张三"; 
  root["年龄"] = 18; 
  root["成绩"].append(88.5);
  root["成绩"].append(98.5);
  root["成绩"].append(93.5);

  //2.构建一个StreamWriterBuilder类对象 
  Json::StreamWriterBuilder swb; 
  
  //3.通过StreamWriterBuilder工厂类对象实例化一个StreamWriter对象  
  Json::StreamWriter* sw = swb.newStreamWriter(); 
  
  //4.使用StreamWriter对象对Json::Value存储的数据进行序列化  
  std::stringstream ss ; 
  int ret = sw->write(root,&ss); 
  if(ret != 0)
  {
    std::cout << "sw->write error , line 28" << std::endl ; 
    return "";
  }
  std::cout << ss.str() << std::endl;
  delete sw;
  return ss.str();
}

void unserialize(std::string& str)
{
  //1.创建CharReaderBuilder 工厂类对象 
  Json::CharReaderBuilder crb;  

  //2.用CharReaderBuilder工厂类对象实例化一个 CharReader对象 
  Json::CharReader* cr = crb.newCharReader();

  //3.创建Json::Value对象用来存储  
  Json::Value root; 

  //4.利用CharReader的parse解析字符串并存储到Json::Value对象中 
  std::string err;
  bool ok = cr->parse(str.c_str(),str.c_str() + str.size(),&root,&err); //把字符串解析并存储到Json::Value对象中  
  if(!ok)
  {
    std::cout << "parse failed , line 48 , " << err << std::endl;
    return ;
  }

  //5.从Json::Value中逐各提取对象  
  std::cout << "姓名 : " << root["姓名"].asString() << std::endl; 
  std::cout << "年龄 : " << root["年龄"].asInt() << std::endl; 
  int sz = root["成绩"].size();
  for(int i = 0 ;  i < sz ; i ++)
  {
     std::cout << "成绩"<< i + 1 << " : " << root["成绩"][i] << std::endl; 
  }
  delete cr;
}

int main()
{
  std::string str = serialize(); 
  unserialize(str);

  return 0;
}
